package com.itheima.collection2;

import java.util.ArrayList;
import java.util.Iterator;

public class Demo1 {

    public static void main(String[] args) {

        //认识并发修改异常问题，掌握三种遍历方式的区别

        //结论：增强for和Lambda表达式只适合做遍历集合，不能遍历并修改

        //解决并发修改异常的方案：
        //      1.使用迭代器删除元素
        //      2.如果集合支持索引，使用for循环遍历，每删除数据后索引减1；或从后往前遍历删除元素



        ArrayList<String> list = new ArrayList<>();
        list.add("Java：从入门到入土");
        list.add("人参");
        list.add("宁夏枸杞");
        list.add("黑枸杞");
        list.add("当归");
        list.add("红枣");
        list.add("特级枸杞");
        list.add("枸杞子");
        list.add("山药");
        System.out.println(list);

        //需求1：删除所有枸杞

        /*for (int i = 0; i < list.size(); i++) {
            String fruit = list.get(i);
            if(fruit.contains("枸杞")){
                list.remove(fruit);
            }
        }       //删除失败，并发修改异常，原因：集合长度发生改变，索引发生改变
        System.out.println(list);*/

        /*for (int i = 0; i < list.size(); i++) {
            String fruit = list.get(i);
            if(fruit.contains("枸杞")){
                list.remove(i);
                i--;        //解决方法1：在删除元素后，让索引减1（必须有索引）
            }
        }
        System.out.println(list);*/

        /*for (int i = list.size() - 1; i >= 0; i--) {      //解决方法2：从后往前遍历，删除元素（必须有索引）
            String fruit = list.get(i);
            if (fruit.contains("枸杞")) {
                list.remove(i);
            }
        }
        System.out.println(list);*/

        //迭代器遍历并删除默认也存在并发修改异常问题
        //解决方法：使用迭代器自己的删除方法
        /*Iterator<String> it = list.iterator();
        while (it.hasNext()) {
            String fruit = it.next();
            if (fruit.contains("枸杞")) {
                //list.remove(fruit);     //抛出异常：ConcurrentModificationException
                it.remove();        //解决方法3：使用迭代器（无索引时只能用迭代器）
            }
        }
        System.out.println(list);*/

        //增强for遍历无法解决并发修改异常问题（底层是基于迭代器实现的）
        /*for (String fruit : list) {
            if (fruit.contains("枸杞")) {
                list.remove(fruit);     //拿不到迭代器对象
            }
        }
        System.out.println(list);*/

        //Lambda表达式也无法解决并发修改异常问题
        list.forEach(fruit -> {
            if (fruit.contains("枸杞")) {
                list.remove(fruit);     //拿不到迭代器对象
            }
        });
        System.out.println(list);


    }
}
